Associated Type Family
Open type synonym familyは型クラスと一緒に用いられることが多いので、
セットで書けるような記法を用意しました、的な
class内での記述
type Hoge ..のように書く
type family Hoge ..と書いても同じ
型パラメータは全て型変数
つまりIntみたいな具体型を型変数には書けない
型クラスの型引数が複数ある場合はどれか一部でも使っていればok
こういうのも可能
code:tf26.hs
class C a b c where
type T c a x :: Type
順番異なる
aとcのみ使う
型クラス引数にない型変数xを使ってる
defaultのinstanceを指定できる
ただし一つまで。
code:hs
class IsBoolMap v where
type Key v
type instance Key v = Int -- default
lookupKey :: Key v -> v -> Maybe Bool
-- 省略可
lookupKey = lookup
その場合、instance宣言時にtype Hoge ..を省略できる
instance内での記述
type Hoge .. = ..のように書く
type instance .. = ..と書いても同じ
以下のココの部分が一致している必要がある
code:hs
instance Collects ココ where
type Elem ココ = e
例
code:hs
instance Eq (Elem e) => Collects e where type Elem x = x -- BAD xじゃなくeにしないといけない type Elem x = x -- BAD 明らかに違う
複数書いてもいい
code:tf30.hs
instance GMapKey Flob where
data GMap Flob Int = G2 Int
...
Associated Type Familyを使って定義されている型クラスの例
class宣言だけ見るとよくわからないが、
instance宣言も複数並べて書いてみると、
良い例があればここに書くmrsekut.icon
Accocieatedというのはどういう意味 ?
何に関連付けられた型族?
「型クラスに」「関連付けられた」「型族」という意味か?